#define GL_GLEXT_PROTOTYPES

#include <QtOpenGL>

#include "glwidget.h"

#include <iostream>
#include <stdio.h>

#include <float.h>

#include <math.h>

#include <qmath.h>


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////




GLWidget::GLWidget(QWidget *parent) :
    QGLWidget(QGLFormat(QGL::SampleBuffers), parent)
{
        makeCurrent();

        setAutoBufferSwap(false);
        setAutoFillBackground(true);

        //////////////
        timeStep = 30;
        //////////////

        timer.setInterval( timeStep );
        timer.start();

        connect(&timer, SIGNAL(timeout()), this, SLOT(update()));

        /////////////////////////////////////////
        _myRender_Mesh                   = false;
        _myRender_Skeleton               = false;
        _myRender_LocalCoord             = false;
        _myRender_FingerTipVertices      = false;
        _myRender_FingerTipVert_CENTROID = false;
        _myRender_FingerTipDetections    = false;

        _myRender_LeftRight_BoneLCS      = false;
        _myRender_PCL_Points             = false;
        _myRender_MESH_FILL              = false;
        /////////////////////////////////////////

        autoPlay = false;

        Skip_Video_forOneCycle = false;

        ///////////////////////////
        trackerInitialized = false;
        ///////////////////////////

}



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////




void GLWidget::initializeGL()
{
        myOpenGL_Flags();

        glClearColor(0.0,0.0,0.0,1);   // BackGround QGLWidget !!!  // wraio xrwma
}




void GLWidget::resizeGL(int w, int h)
{
        glViewport( 0, 0, 640/*tracker->sequence.videoSequence.frameWidth*/, 480/*tracker->sequence.videoSequence.frameHeight*/);
}



/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////




void GLWidget::paintGL()
{

    glClear(GL_COLOR_BUFFER_BIT | GL_ACCUM_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    glClearColor(0.0,0.0,0.0,1);   // BackGround QGLWidget !!!

    ///////////////////////
    if (trackerInitialized)
    ///////////////////////
    {

                if (tracker->typesBackground.Blank==false && Skip_Video_forOneCycle==false)
                {
                    myRenderVideoBackground();
                }

                if (Skip_Video_forOneCycle)
                    Skip_Video_forOneCycle = false;

                ///////////////////////////////
                glClear( GL_DEPTH_BUFFER_BIT ); // meta to background !!!
                ///////////////////////////////


                if (_myRender_Mesh || _myRender_Skeleton)
                {
                    if (_myRender_Mesh)                         myRenderMesh();
                    if (_myRender_Skeleton)                     myRenderSkeleton();
                    if (_myRender_PCL_Points)                   myRender_PCL_Points();

                    ///////////////////////////////
                    glClear( GL_DEPTH_BUFFER_BIT ); // needed here for overlay - QPainter on Filled Mesh !!!
                    ///////////////////////////////
                }


                if (_myRender_FingerTipDetections && tracker->typesBackground.Blank==false)     myRender_fingerTip_Detections();


                if (autoPlay == true)
                {
                    tracker->incrFrameNumber();

                    emit openGL_AutoPlay_UpdUi_SIGNAL();
                }

    }

    ////////////////////////////
    swapBuffers();    //glFlush();
    ////////////////////////////

}
